// using UnityEngine;
// using GGameFramework.Core.FSM;
//
// namespace GGameFramework.Examples.FSM
// {
//     /// <summary>
//     /// 玩家跳跃状态
//     /// </summary>
//     public class PlayerJumpState : FsmState<PlayerController>
//     {
//         private const string KEY_IS_GROUNDED = "IsGrounded";
//         private const string KEY_ATTACK_INPUT = "AttackInput";
//         
//         private float m_JumpStartTime;
//         private float m_JumpDuration = 1.2f;
//         private bool m_JumpExecuted = false;
//         private Vector3 m_JumpVelocity;
//         
//         protected internal override void OnInit(IFsm<PlayerController> fsm)
//         {
//             Debug.Log("跳跃状态初始化");
//         }
//         
//         protected internal override void OnEnter(IFsm<PlayerController> fsm)
//         {
//             PlayerController player = fsm.Owner;
//             m_JumpStartTime = 0f;
//             m_JumpExecuted = false;
//             
//             // 设置跳跃动画
//             if (player.GetAnimator() != null)
//             {
//                 player.GetAnimator().SetBool("IsJumping", true);
//                 player.GetAnimator().SetBool("IsMoving", false);
//                 player.GetAnimator().SetBool("IsAttacking", false);
//                 player.GetAnimator().SetTrigger("JumpStart");
//             }
//             
//             // 播放跳跃音效
//             // player.PlaySound(jumpSound);
//             
//             // 执行跳跃物理
//             ExecuteJump(player);
//             
//             Debug.Log("进入跳跃状态");
//         }
//         
//         protected internal override void OnUpdate(IFsm<PlayerController> fsm, float elapseSeconds, float realElapseSeconds)
//         {
//             PlayerController player = fsm.Owner;
//             CharacterController characterController = player.GetCharacterController();
//             m_JumpStartTime += elapseSeconds;
//             
//             // 检查攻击输入（空中攻击）
//             bool attackInput = fsm.GetData<BoolVariable>(KEY_ATTACK_INPUT)?.Value ?? false;
//             if (attackInput && player.CanAttack())
//             {
//                 ChangeState<PlayerAttackState>(fsm);
//                 return;
//             }
//             
//             // 更新跳跃物理
//             UpdateJumpPhysics(player, characterController, elapseSeconds);
//             
//             // 检查是否落地
//             bool isGrounded = characterController.isGrounded;
//             fsm.SetData("IsGrounded", new BoolVariable(isGrounded));
//             
//             if (isGrounded && m_JumpStartTime > 0.1f)
//             {
//                 // 落地，切换到空闲状态
//                 ChangeState<PlayerIdleState>(fsm);
//                 return;
//             }
//             
//             // 检查生命值状态
//             int currentHealth = fsm.GetData<IntVariable>("Health")?.Value ?? 100;
//             if (currentHealth <= 0)
//             {
//                 ChangeState<PlayerDeathState>(fsm);
//                 return;
//             }
//         }
//         
//         protected internal override void OnLeave(IFsm<PlayerController> fsm, bool isShutdown)
//         {
//             PlayerController player = fsm.Owner;
//             
//             // 停止跳跃动画
//             if (player.GetAnimator() != null)
//             {
//                 player.GetAnimator().SetBool("IsJumping", false);
//             }
//             
//             // 播放落地音效
//             // player.PlaySound(landingSound);
//             
//             Debug.Log("离开跳跃状态");
//         }
//         
//         protected internal override void OnDestroy(IFsm<PlayerController> fsm)
//         {
//             Debug.Log("跳跃状态销毁");
//         }
//         
//         /// <summary>
//         /// 执行跳跃
//         /// </summary>
//         private void ExecuteJump(PlayerController player)
//         {
//             CharacterController characterController = player.GetCharacterController();
//             if (characterController == null) return;
//             
//             // 计算跳跃速度
//             float jumpForce = player.GetJumpForce();
//             m_JumpVelocity = Vector3.up * jumpForce;
//             
//             // 应用跳跃速度
//             characterController.Move(m_JumpVelocity * Time.deltaTime);
//             
//             m_JumpExecuted = true;
//         }
//         
//         /// <summary>
//         /// 更新跳跃物理
//         /// </summary>
//         private void UpdateJumpPhysics(PlayerController player, CharacterController characterController, float deltaTime)
//         {
//             if (characterController == null) return;
//             
//             // 应用重力
//             float gravity = player.GetGravity();
//             m_JumpVelocity.y += gravity * deltaTime;
//             
//             // 应用移动
//             Vector3 moveInput = fsm.GetData<Vector3Variable>("MoveInput")?.Value ?? Vector3.zero;
//             if (moveInput.magnitude > 0.1f)
//             {
//                 float moveSpeed = player.GetMoveSpeed() * 0.5f; // 空中移动速度减半
//                 Vector3 horizontalMovement = moveInput.normalized * moveSpeed * deltaTime;
//                 m_JumpVelocity.x = horizontalMovement.x;
//                 m_JumpVelocity.z = horizontalMovement.z;
//             }
//             
//             // 执行移动
//             characterController.Move(m_JumpVelocity * deltaTime);
//         }
//         
//         public override string GetStateName()
//         {
//             return "跳跃状态";
//         }
//         
//         public override bool CanTransitionTo<TState>(IFsm<PlayerController> fsm)
//         {
//             // 跳跃状态可以转换到大部分状态
//             return true;
//         }
//     }
// }
